#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <windows.h>
#include <GL/glut.h>
#endif

#include <stdlib.h>
#include <iostream>
using namespace std;

#include "Curva.h"
#include "Ponto.h"
Curva::Curva ()
{
    //ctor
}

Curva::~Curva()
{
    //dtor
}
void Curva::calculaAreaSelecao() {
    float max_X = m_Pontos[0]->GetPosX();
    float max_Y = m_Pontos[0]->GetPosY();
    float min_X = m_Pontos[0]->GetPosX();
    float min_Y = m_Pontos[0]->GetPosY();
    std::vector<Ponto*>::iterator itrPonto;
    for ( itrPonto = m_Pontos.begin(); itrPonto != m_Pontos.end(); ++itrPonto )
    {
        if ((*itrPonto)->GetPosX() < min_X) {
            min_X = (*itrPonto)->GetPosX();
        }

        if ((*itrPonto)->GetPosX() > max_X) {
            max_X = (*itrPonto)->GetPosX();
        }

        if ((*itrPonto)->GetPosY() < min_Y) {
            min_Y = (*itrPonto)->GetPosY();
        }

        if ((*itrPonto)->GetPosY() > max_Y) {
            max_Y = (*itrPonto)->GetPosY();
        }
    }

    adPontoSelecao(min_X, min_Y);
    adPontoSelecao(max_X, max_Y);
}
void Curva::desenharPoligonal() {
    Ponto* anterior;
    bool first = true;
    std::vector<Ponto*>::iterator itrPonto;
    for ( itrPonto = m_Pontos.begin(); itrPonto != m_Pontos.end(); ++itrPonto )
    {
        glColor3d(0,1,0);
        glBegin(GL_QUADS);
            glVertex2f(((*itrPonto)->GetPosX())-2, ((*itrPonto)->GetPosY())-2); // canto esquerdo inferior
            glVertex2f((*itrPonto)->GetPosX()-2, (*itrPonto)->GetPosY()+2); // canto esquerdo superior
            glVertex2f((*itrPonto)->GetPosX()+2, (*itrPonto)->GetPosY()+2); // canto direito superior
            glVertex2f((*itrPonto)->GetPosX()+2, (*itrPonto)->GetPosY()-2); // canto direito inferior
        glEnd();

        if (this->isSelected())
        {
            glColor3d(1,1,0);
            glBegin(GL_QUADS);
                glVertex2f(((*itrPonto)->GetPosX())-5, ((*itrPonto)->GetPosY())-5); // canto esquerdo inferior
                glVertex2f((*itrPonto)->GetPosX()-5, (*itrPonto)->GetPosY()+5); // canto esquerdo superior
                glVertex2f((*itrPonto)->GetPosX()+5, (*itrPonto)->GetPosY()+5); // canto direito superior
                glVertex2f((*itrPonto)->GetPosX()+5, (*itrPonto)->GetPosY()-5); // canto direito inferior
            glEnd();
        }

        glColor3d(0.2,0.2,0.2);
        if (!first) {
            glBegin(GL_LINES);
                glVertex2f(anterior->GetPosX(), anterior->GetPosY());
                glVertex2f((*itrPonto)->GetPosX(), (*itrPonto)->GetPosY());
            glEnd();
        }
        else {
            first = false;
        }
        anterior = *itrPonto;

    }
}
void Curva::adPontoSelecao(float x, float y) {
    Ponto* p;
    p = new Ponto(x,y);
    m_AreaSelecao.push_back(p);
}

bool Curva::isInsideBoudary(float x, float y) {
    float max_X, max_Y, min_X, min_Y;
    min_X = m_AreaSelecao.front()->GetPosX();
    min_Y = m_AreaSelecao.front()->GetPosY();
    max_X = m_AreaSelecao.back()->GetPosX();
    max_Y = m_AreaSelecao.back()->GetPosY();

    if ((x > min_X) && (x < max_X) && (y > min_Y) && (y < max_Y)) {
        return true;
    }
    return false;
}
